/* ************************************************************************
> File Name:     LinkedList.cpp
# Author:        
# mail:          
> Created Time:  2023年02月13日 星期一 20时26分02秒
> Description:   
 ************************************************************************/

#include "../include/LinkedList.h"

template <typename T>
Linklist<T> mergeList(Linklist<T> l1, Linklist<T> l2)
{
    Linklist<T> l;
    int i = 0, j = 0, cnt = 0;
    while(l1.size() != i && l2.size() != j)
    {
        if(l1.getNElement(i + 1) == l2.getNElement(j + 1))
        {
            l.rearAdd(l1.getNElement(i + 1));
            i++;
            j++;
        }
        else if(l1.getNElement(i + 1) < l2.getNElement(j + 1))
        {
            l.rearAdd(l1.getNElement(i + 1));
            i++;
        }
        else if(l1.getNElement(i + 1) > l2.getNElement(j + 1)) 
        {
            l.rearAdd(l2.getNElement(j + 1));
            j++;
        }
        else
        {
            cout << "错误" << endl;
        }
        cnt++;
    }
    while(l1.size() != i)
    {
        l.rearAdd(l1.getNElement(i + 1));
        i++;
        cnt++;
    }
    while(l2.size() != j)
    {
        l.rearAdd(l2.getNElement(j + 1)); 
        j++;
        cnt++;
    }
    for(int k = 1; k < l.size(); k++)
    {
        while(l.getNElement(k) == l.getNElement(k + 1))
            l.deleteNElement(k + 1);
    }
    return l;
}

template <typename T>
Linklist<T> intersectList(Linklist<T> l1, Linklist<T> l2)
{
    Linklist<T> l;
    int i = 0;
    while(l1.size() != i)
    {
        int j = 0;
        while(l2.size() != j)
        {
            if(l1.getNElement(i + 1) == l2.getNElement(j + 1))
            {
                l.rearAdd(l1.getNElement(i + 1));
                break;
            }
            j++;
        }
        i++;
    }
    for(int k = 1; k < l.size(); k++)
    {
        while(l.getNElement(k) == l.getNElement(k + 1))
            l.deleteNElement(k + 1);
    }
    return l;
}

void MyLinkedList()
{
    Linklist<int> l1, l2;
    cout << "请输入链表一，例如 1 2 3 4 ..." << endl;
    string x;
    while(cin >> x)
    {
        int m = isTrue(x);
        if(m != -1)
        {
            l1.rearAdd(m);
        }
        else 
        {
            return;
        }
        if(cin.get() == '\n') break;
    }
    cout << "请输入链表二，例如 1 2 3 4 ..." << endl;
    while(cin >> x)
    {
        int m = isTrue(x);
        if(m != -1)
        {
            l2.rearAdd(m);
        }
        else 
        {
            return;
        }
        if(cin.get() == '\n') break;
    }
    cout << endl;
    cout << "现在链表一为：" << endl;
    l1.print();
    cout << "现在链表二为：" << endl;
    l2.print();
    cout << endl << "链表一排序后：" << endl;
    l1.sort();
    l1.print();
    cout << "链表二排序后：" << endl;
    l2.sort();
    l2.print();
    cout << endl << "合并两条链表：" << endl;
    Linklist<int> l3 = mergeList(l1, l2);
    l3.print();
    cout << endl << "两条链表的交集：" << endl;
    Linklist<int> l4 = intersectList(l1, l2);
    l4.print();
    cout << endl;
}

